# Лекция: Spring Boot для тестировщика автоматизатора - Component, Service, Autowired

Spring Boot использует Dependency Injection (Внедрение зависимостей) для связывания классов вместе. Это делается с помощью аннотаций `@Component`, `@Service` и `@Autowired`.

## @Component

Аннотация `@Component` используется для определения класса как компонента Spring. Компоненты Spring автоматически создаются и управляются Spring Boot.

```java
@Component
public class MyComponent {
    // код компонента
}
```

## @Service

Аннотация `@Service` является специализированной версией `@Component` и используется для определения класса как сервиса Spring. Сервисы Spring обычно содержат бизнес-логику.

```java
@Service
public class MyService {
    // код сервиса
}
```

## @Autowired

Аннотация `@Autowired` используется для автоматического связывания компонентов и сервисов Spring. Это позволяет Spring Boot автоматически предоставлять зависимости класса.

```java
@Service
public class MyService {
    private final MyComponent myComponent;

    @Autowired
    public MyService(MyComponent myComponent) {
        this.myComponent = myComponent;
    }

    // код сервиса
}
```

В этом примере `MyService` автоматически получает экземпляр `MyComponent` от Spring Boot.

---

# Практические задания

1. **Создайте класс `MyComponent` с аннотацией `@Component` и методом `sayHello`, который возвращает строку "Hello".** (Сложность: 1/5)
```java
@Component
public class MyComponent {
    public String sayHello() {
        return "Hello";
    }
}
```

2. **Создайте класс `MyService` с аннотацией `@Service` и методом `getGreeting`, который возвращает строку "Greetings".** (Сложность: 1/5)
```java
@Service
public class MyService {
    public String getGreeting() {
        return "Greetings";
    }
}
```

3. **Измените класс `MyService`, чтобы он использовал `MyComponent` для получения приветствия.** (Сложность: 2/5)
```java
@Service
public class MyService {
    private final MyComponent myComponent;

    @Autowired
    public MyService(MyComponent myComponent) {
        this.myComponent = myComponent;
    }

    public String getGreeting() {
        return myComponent.sayHello();
    }
}
```

4. **Создайте класс `MyController` с аннотацией `@RestController`, который использует `MyService` для обработки GET-запросов на URL "/greeting".** (Сложность: 3/5)
```java
@RestController
public class MyController {
    private final MyService myService;

    @Autowired
    public MyController(MyService myService) {
        this.myService = myService;
    }

    @GetMapping("/greeting")
    public String greeting() {
        return myService.getGreeting();
    }
}
```

5. **Создайте тестовый класс, который тестирует, что GET-запрос на URL "/greeting" возвращает строку "Hello".** (Сложность: 3/5)
```java
@SpringBootTest
@AutoConfigureMockMvc
class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void shouldReturnDefaultMessage() throws Exception {
        this.mockMvc.perform(get("/greeting"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello"));
    }

}
```